Multi i-TED characterization¶

Fourth: Per pixel threshold¶

  • In the previous notebook it was proposed to apply thresholds per pixel:
    • To get to a lower overall threshold that should equate to better resolution.
    • To decrease the size of files, which increases greatly for lower threshoilds due to noise.
    • To study if it impacts the considerable increase in resolution present in iTED-C-0 that was hypothesised being related to noise starting the integration window.
  • The 888 configuration is compared to 887 and 88c which stands for 887 with some pixels changed manually.
  • Studies of alpha activity and noise are added.
In [1]:
pkg_ver = lambda pkg: "{:<20}{:}".format(pkg.__name__,pkg.__version__)

# ROOT
import uproot
print(pkg_ver(uproot))
import ROOT

# Machine Learning
import sklearn
print(pkg_ver(sklearn))
import torch
print(pkg_ver(torch))

# Data science
import scipy
print(pkg_ver(scipy))
import numpy
print(pkg_ver(numpy))
import pandas
print(pkg_ver(pandas))

# Visualizations
import matplotlib
print(pkg_ver(matplotlib))
import matplotlib.pyplot as plt

import tqdm
print(pkg_ver(tqdm))
uproot              4.3.5
Welcome to JupyROOT 6.26/10
sklearn             1.2.2
torch               2.0.0rc5
scipy               1.10.1
numpy               1.24.2
pandas              1.5.3
matplotlib          3.6.3
tqdm                4.62.3
In [2]:
%jsroot
In [3]:
class spectrum:
    
    def __init__(self, TH1D_, iTED_, Crystal_, Configuration_, Window_, Calibration_):  

        self.__TH1D = TH1D_
        self.__iTED = iTED_
        self.__Crystal = Crystal_
        self.__Configuration = Configuration_
        self.__Window = Window_
        self.__Calibration = Calibration_
        
    def __call__(self, ch):
        return numpy.polyval(self.__Calibration[::-1],ch)
    
    def __ch__(self, en):
        p = numpy.poly1d(self.__Calibration[::-1])
        temp  = set(i for i in (p - en).roots if i > 0)
        return list(temp).pop()
    
    def TH1D(self):
        return self.__TH1D
    
    def Calibration(self):
        return self.__Calibration
    
    def iTED(self):
        return self.__iTED
    
    def Crystal(self):
        return self.__Crystal
    
    def Configuration(self):
        return self.__Configuration
    
    def Window(self):
        return self.__Window
    
    def Noise(self, Time_):
        return self.__TH1D.Integral(
            0,
            self.__TH1D.FindBin(self.__ch__(250))
        )/Time_
    
    def Alpha(self, Time_):
        return self.__TH1D.Integral(
            self.__TH1D.FindBin(self.__ch__(1600)),
            self.__TH1D.FindBin(self.__ch__(2800))
        )/Time_
    
    def __repr__(self):
        return "iTED: {},Crystal: {},Configuration: {},Window: {}".format(
            self.__iTED,
            self.__Crystal,
            self.__Configuration,
            self.__Window
        )
    
    def __str__(self):
        return "{}.{}.{}.{}".format(
            self.__iTED,
            self.__Crystal,
            self.__Configuration,
            self.__Window
        )
In [4]:
iTEDA_cal = pandas.read_csv(
    "../../data/2023-03-02/Energy_Calibrations_02_03_2023/Energy_Calibrations_iTEDA.dat",
    delim_whitespace=True,
    names=["P0","P1","P2"]
)

iTEDB_cal = pandas.read_csv(
    "../../data/2023-03-02/Energy_Calibrations_02_03_2023/Energy_Calibrations_iTEDB.dat",
    delim_whitespace=True,
    names=["P0","P1","P2"]
)

iTEDC_cal = pandas.read_csv(
    "../../data/2023-03-02/Energy_Calibrations_02_03_2023/Energy_Calibrations_iTEDC.dat",
    delim_whitespace=True,
    names=["P0","P1","P2"]
)

iTEDD_cal = pandas.read_csv(
    "../../data/2023-03-02/Energy_Calibrations_02_03_2023/Energy_Calibrations_iTEDD.dat",
    delim_whitespace=True,
    names=["P0","P1","P2"]
)

iTED_cal = pandas.concat([iTEDA_cal.T, iTEDB_cal.T, iTEDC_cal.T, iTEDD_cal.T], axis=1, keys=['A', 'B', 'C', 'D'])

iTED_cal
Out[4]:
A B C D
0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4
P0 97.91440 138.744000 164.131000 96.575700 184.627000 123.545000 181.753000 164.939000 162.539000 156.664000 115.328000 147.053000 129.204000 144.779000 132.346000 91.325100 138.429000 121.824000 138.067000 122.738000
P1 1.96942 1.813160 2.304510 1.764130 2.327000 2.228220 2.581200 2.116580 2.010630 2.193700 2.179250 2.005310 2.079170 2.152760 2.311890 2.016440 2.065850 2.071090 2.132460 1.964320
P2 0.00042 0.000665 0.001125 0.000595 0.001193 0.000559 0.001048 0.001154 0.000915 0.000946 0.000469 0.000859 0.000717 0.000836 0.000898 0.000479 0.000809 0.000667 0.000949 0.000705
In [5]:
config = ["888", "887", "88c"]
CW = [100,150,200,250]

ited = ["A","B","C","D"]
crystal = [0,1,2,3,4]

midx = pandas.MultiIndex.from_product(
    [config, CW],
    names=['Configuration', 'Window']
)

mcol = pandas.MultiIndex.from_product(
    [ited, crystal],
    names=['iTED', 'Crystal']
) 

spectra = pandas.DataFrame(index = midx, columns = mcol)

# Access using spectra[iTED,Crystal][Configuration,Window]
In [6]:
iTEDA = {
    "888-100": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDA-A2_D.2023_02_23_T.13_40_46_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW100.root","READ"),
    "888-150": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDA-A2_D.2023_02_23_T.13_40_46_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW150.root","READ"),
    "888-200": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDA-A2_D.2023_02_23_T.13_40_46_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW200.root","READ"),
    "888-250": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDA-A2_D.2023_02_23_T.13_40_46_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW250.root","READ"),
    "88c-100": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDA-A2_D.2023_03_14_T.14_28_07_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW100.root","READ"),
    "88c-150": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDA-A2_D.2023_03_14_T.14_28_07_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW150.root","READ"),
    "88c-200": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDA-A2_D.2023_03_14_T.14_28_07_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW200.root","READ"),
    "88c-250": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDA-A2_D.2023_03_14_T.14_28_07_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW250.root","READ"),
    "887-100": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDA-A2_D.2023_03_21_T.14_50_48_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW100.root","READ"),
    "887-150": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDA-A2_D.2023_03_21_T.14_50_48_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW150.root","READ"),
    "887-200": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDA-A2_D.2023_03_21_T.14_50_48_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW200.root","READ"),
    "887-250": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDA-A2_D.2023_03_21_T.14_50_48_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW250.root","READ")
}

iTEDB = {
    "888-100": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137_AfterReconnecting_gum_iTEDB-middle_D.2023_03_02_T.15_22_31_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW100.root","READ"),
    "888-150": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137_AfterReconnecting_gum_iTEDB-middle_D.2023_03_02_T.15_22_31_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW150.root","READ"),
    "888-200": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137_AfterReconnecting_gum_iTEDB-middle_D.2023_03_02_T.15_22_31_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW200.root","READ"),
    "888-250": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137_AfterReconnecting_gum_iTEDB-middle_D.2023_03_02_T.15_22_31_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW250.root","READ"),
    "88c-100": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDB-A2_D.2023_03_14_T.14_35_17_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW100.root","READ"),
    "88c-150": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDB-A2_D.2023_03_14_T.14_35_17_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW150.root","READ"),
    "88c-200": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDB-A2_D.2023_03_14_T.14_35_17_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW200.root","READ"),
    "88c-250": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDB-A2_D.2023_03_14_T.14_35_17_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW250.root","READ"),
    "887-100": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDB-A2_D.2023_03_21_T.14_57_39_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW100.root","READ"),
    "887-150": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDB-A2_D.2023_03_21_T.14_57_39_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW150.root","READ"),
    "887-200": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDB-A2_D.2023_03_21_T.14_57_39_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW200.root","READ"),
    "887-250": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDB-A2_D.2023_03_21_T.14_57_39_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW250.root","READ")
}

iTEDC = {
    "888-100": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDC-A1_D.2023_02_23_T.13_26_03_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW100.root","READ"),
    "888-150": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDC-A1_D.2023_02_23_T.13_26_03_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW150.root","READ"),
    "888-200": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDC-A1_D.2023_02_23_T.13_26_03_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW200.root","READ"),
    "888-250": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDC-A1_D.2023_02_23_T.13_26_03_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW250.root","READ"),
    "88c-100": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDC-A1_D.2023_03_14_T.14_41_53_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW100.root","READ"),
    "88c-150": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDC-A1_D.2023_03_14_T.14_41_53_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW150.root","READ"),
    "88c-200": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDC-A1_D.2023_03_14_T.14_41_53_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW200.root","READ"),
    "88c-250": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDC-A1_D.2023_03_14_T.14_41_53_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW250.root","READ"),
    "887-100": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDC-A1_D.2023_03_21_T.15_05_52_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW100.root","READ"),
    "887-150": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDC-A1_D.2023_03_21_T.15_05_52_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW150.root","READ"),
    "887-200": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDC-A1_D.2023_03_21_T.15_05_52_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW200.root","READ"),
    "887-250": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDC-A1_D.2023_03_21_T.15_05_52_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW250.root","READ")
}

iTEDD = {
    "888-100": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDD-A1_D.2023_02_23_T.13_03_18_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW100.root","READ"),
    "888-150": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDD-A1_D.2023_02_23_T.13_03_18_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW150.root","READ"),
    "888-200": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDD-A1_D.2023_02_23_T.13_03_18_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW200.root","READ"),
    "888-250": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDD-A1_D.2023_02_23_T.13_03_18_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW250.root","READ"),
    "88c-100": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDD-A1_D.2023_03_14_T.14_48_58_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW100.root","READ"),
    "88c-150": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDD-A1_D.2023_03_14_T.14_48_58_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW150.root","READ"),
    "88c-200": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDD-A1_D.2023_03_14_T.14_48_58_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW200.root","READ"),
    "88c-250": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDD-A1_D.2023_03_14_T.14_48_58_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW250.root","READ"),
    "887-100": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDD-A1_D.2023_03_21_T.15_12_02_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW100.root","READ"),
    "887-150": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDD-A1_D.2023_03_21_T.15_12_02_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW150.root","READ"),
    "887-200": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDD-A1_D.2023_03_21_T.15_12_02_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW200.root","READ"),
    "887-250": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDD-A1_D.2023_03_21_T.15_12_02_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW250.root","READ")
}
In [7]:
for iTED in[0,1,2,3]:
    for Crystal in [0,1,2,3,4]:
        for Configuration in ["888", "887", "88c"]:
            for CW in [100,150,200,250]:
            
                spectra[
                    ["A","B","C","D"][iTED], Crystal
                ][
                    Configuration, CW
                ] = spectrum(
                    [iTEDA,iTEDB,iTEDC,iTEDD][iTED][f"{Configuration}-{CW}"].Get(
                        "{}_{}_amplitude_spectra;1".format(
                            "SCATTERER" if Crystal==0 else "ABSORBER",
                            ["A","B","C","D"][iTED] if Crystal==0 else "{}_{}".format(["A","B","C","D"][iTED],Crystal)
                        )
                    ), 
                    ["A","B","C","D"][iTED], 
                    Crystal, 
                    Configuration, 
                    CW, 
                    iTED_cal[:][["A","B","C","D"][iTED],Crystal]
                )
In [8]:
spectra.dropna(inplace=True)
spectra.applymap(str)
Out[8]:
iTED A B C D
Crystal 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4
Configuration Window
888 100 A.0.888.100 A.1.888.100 A.2.888.100 A.3.888.100 A.4.888.100 B.0.888.100 B.1.888.100 B.2.888.100 B.3.888.100 B.4.888.100 C.0.888.100 C.1.888.100 C.2.888.100 C.3.888.100 C.4.888.100 D.0.888.100 D.1.888.100 D.2.888.100 D.3.888.100 D.4.888.100
150 A.0.888.150 A.1.888.150 A.2.888.150 A.3.888.150 A.4.888.150 B.0.888.150 B.1.888.150 B.2.888.150 B.3.888.150 B.4.888.150 C.0.888.150 C.1.888.150 C.2.888.150 C.3.888.150 C.4.888.150 D.0.888.150 D.1.888.150 D.2.888.150 D.3.888.150 D.4.888.150
200 A.0.888.200 A.1.888.200 A.2.888.200 A.3.888.200 A.4.888.200 B.0.888.200 B.1.888.200 B.2.888.200 B.3.888.200 B.4.888.200 C.0.888.200 C.1.888.200 C.2.888.200 C.3.888.200 C.4.888.200 D.0.888.200 D.1.888.200 D.2.888.200 D.3.888.200 D.4.888.200
250 A.0.888.250 A.1.888.250 A.2.888.250 A.3.888.250 A.4.888.250 B.0.888.250 B.1.888.250 B.2.888.250 B.3.888.250 B.4.888.250 C.0.888.250 C.1.888.250 C.2.888.250 C.3.888.250 C.4.888.250 D.0.888.250 D.1.888.250 D.2.888.250 D.3.888.250 D.4.888.250
887 100 A.0.887.100 A.1.887.100 A.2.887.100 A.3.887.100 A.4.887.100 B.0.887.100 B.1.887.100 B.2.887.100 B.3.887.100 B.4.887.100 C.0.887.100 C.1.887.100 C.2.887.100 C.3.887.100 C.4.887.100 D.0.887.100 D.1.887.100 D.2.887.100 D.3.887.100 D.4.887.100
150 A.0.887.150 A.1.887.150 A.2.887.150 A.3.887.150 A.4.887.150 B.0.887.150 B.1.887.150 B.2.887.150 B.3.887.150 B.4.887.150 C.0.887.150 C.1.887.150 C.2.887.150 C.3.887.150 C.4.887.150 D.0.887.150 D.1.887.150 D.2.887.150 D.3.887.150 D.4.887.150
200 A.0.887.200 A.1.887.200 A.2.887.200 A.3.887.200 A.4.887.200 B.0.887.200 B.1.887.200 B.2.887.200 B.3.887.200 B.4.887.200 C.0.887.200 C.1.887.200 C.2.887.200 C.3.887.200 C.4.887.200 D.0.887.200 D.1.887.200 D.2.887.200 D.3.887.200 D.4.887.200
250 A.0.887.250 A.1.887.250 A.2.887.250 A.3.887.250 A.4.887.250 B.0.887.250 B.1.887.250 B.2.887.250 B.3.887.250 B.4.887.250 C.0.887.250 C.1.887.250 C.2.887.250 C.3.887.250 C.4.887.250 D.0.887.250 D.1.887.250 D.2.887.250 D.3.887.250 D.4.887.250
88c 100 A.0.88c.100 A.1.88c.100 A.2.88c.100 A.3.88c.100 A.4.88c.100 B.0.88c.100 B.1.88c.100 B.2.88c.100 B.3.88c.100 B.4.88c.100 C.0.88c.100 C.1.88c.100 C.2.88c.100 C.3.88c.100 C.4.88c.100 D.0.88c.100 D.1.88c.100 D.2.88c.100 D.3.88c.100 D.4.88c.100
150 A.0.88c.150 A.1.88c.150 A.2.88c.150 A.3.88c.150 A.4.88c.150 B.0.88c.150 B.1.88c.150 B.2.88c.150 B.3.88c.150 B.4.88c.150 C.0.88c.150 C.1.88c.150 C.2.88c.150 C.3.88c.150 C.4.88c.150 D.0.88c.150 D.1.88c.150 D.2.88c.150 D.3.88c.150 D.4.88c.150
200 A.0.88c.200 A.1.88c.200 A.2.88c.200 A.3.88c.200 A.4.88c.200 B.0.88c.200 B.1.88c.200 B.2.88c.200 B.3.88c.200 B.4.88c.200 C.0.88c.200 C.1.88c.200 C.2.88c.200 C.3.88c.200 C.4.88c.200 D.0.88c.200 D.1.88c.200 D.2.88c.200 D.3.88c.200 D.4.88c.200
250 A.0.88c.250 A.1.88c.250 A.2.88c.250 A.3.88c.250 A.4.88c.250 B.0.88c.250 B.1.88c.250 B.2.88c.250 B.3.88c.250 B.4.88c.250 C.0.88c.250 C.1.88c.250 C.2.88c.250 C.3.88c.250 C.4.88c.250 D.0.88c.250 D.1.88c.250 D.2.88c.250 D.3.88c.250 D.4.88c.250
In [9]:
def get_resolution(cell):
    
    TH1D = cell.TH1D()
    
    TH1D.GetXaxis().SetRange(TH1D.FindBin(100),TH1D.FindBin(400))
    
    MaxBin   = TH1D.FindBin(TH1D.GetMaximumBin())
    
    ADC_Low  = MaxBin-60
    ADC_High = MaxBin+40

    gaussFit = ROOT.TF1("gaussFit", "pol1(0)+gaus(2)", ADC_Low, ADC_High)
    gaussFit.SetParameters(1000,-1,TH1D.GetMaximum(),MaxBin,10)
    TH1D.Fit(gaussFit,"QR")
    
    sigma = abs(gaussFit.GetParameter(4))
    centroid_ch = gaussFit.GetParameter(3)
    
    x1 = cell(centroid_ch+sigma*numpy.sqrt(2*numpy.log(2)))
    x2 = cell(centroid_ch-sigma*numpy.sqrt(2*numpy.log(2)))
    centroid = cell(centroid_ch)
        
    fwhm = x1-x2
            
    return sigma*numpy.sqrt(2*numpy.log(2))*2/centroid_ch*100, (fwhm/centroid)*100, centroid
In [10]:
def TH1D_draw(cell):
    
    TH1D = cell.TH1D()
    
    canvas = ROOT.TCanvas()
    canvas.cd()
    
    TH1D.SetTitle(repr(cell))
    TH1D.SetStats(False)
    
    latex = ROOT.TLatex()
    latex.SetNDC()
    latex.SetTextSize(0.03)
    
    TH1D.Draw("pe")
    
    l1,l2,l3 = get_resolution(cell)
    
    l4 = uproot.open(f"../../data/nTOF_March2022/888/CW100ns/Resolutions_Cs137_CenterScatter_iTED{cell.iTED()}_8.8.8_100ns.root:grResolEnergy;1").values()[1][cell.Crystal()]
    
    latex.DrawText(0.7, 0.8, "R_ch: {:.2f}%".format(l1))
    
    if l4*0.9 < l2 < l4*1.1:
        latex.DrawText(0.7, 0.75, "R_E: {:.2f}%".format(l2))
    else:
        latex.DrawText(0.7, 0.75, "->R_E: {:.2f}%".format(l2))
        
    if 662*(1-l2/100) < l3 < 662*(1+l2/100):
        latex.DrawText(0.7, 0.7, "E: {:.0f}keV".format(l3))
    else:
        latex.DrawText(0.7, 0.7, "->E: {:.0f}keV".format(l3))
        
    latex.DrawText(0.7, 0.65, "R_E(old): {:.2f}%".format(l4))
    latex.DrawText(0.7, 0.6, "Change: {:.2f}%".format(l2-l4))
            
    return canvas

Analysis¶

Energy resolution @662keV¶

Using channel values¶

In [11]:
spectra.applymap(lambda x: get_resolution(x)[0]).T.describe().drop(['count', 'std'], axis=0).style.background_gradient(cmap ='YlOrRd',axis=None)
Out[11]:
Configuration 888 887 88c
Window 100 150 200 250 100 150 200 250 100 150 200 250
mean 8.384339 8.284824 8.179738 8.088119 8.404514 8.260254 8.168116 8.069058 8.205656 8.095049 7.989033 7.893597
min 6.572851 6.511189 6.462154 6.437791 6.389740 6.388251 6.388026 6.387243 6.525593 6.523872 6.524571 6.523416
25% 7.075074 7.053681 7.008073 6.964889 7.078504 6.978950 6.931826 6.926262 7.019665 6.955688 6.916974 6.911327
50% 8.225909 8.070114 7.909846 7.781751 8.163990 7.992299 7.856192 7.710460 7.935067 7.823580 7.733675 7.599282
75% 9.645031 9.582242 9.465428 9.371003 9.864735 9.727948 9.630359 9.407380 9.262555 9.173130 9.039284 8.977927
max 11.434119 11.245839 10.762453 10.524706 11.490752 11.455784 11.441227 11.421454 10.867837 10.729804 10.612429 10.583095
Info in <TCanvas::MakeDefCanvas>:  created default TCanvas with name c1

Using the current calibration (March 2023, 888, 100ns)¶

In [12]:
resolution = spectra.applymap(lambda x: get_resolution(x)[1])
In [13]:
resolution.T.describe().drop(['count', 'std'], axis=0).style.background_gradient(cmap ='YlOrRd',axis=None)
Out[13]:
Configuration 888 887 88c
Window 100 150 200 250 100 150 200 250 100 150 200 250
mean 7.193958 7.111687 7.024524 6.947401 7.098719 6.980382 6.905127 6.822373 7.027980 6.936768 6.848609 6.768283
min 5.690363 5.638254 5.596447 5.575697 5.567239 5.565940 5.565758 5.565070 5.678580 5.677089 5.677704 5.676694
25% 6.242677 6.203176 6.200747 6.188435 6.281600 6.245942 6.150291 6.113693 6.202920 6.187947 6.161628 6.147785
50% 6.982063 6.845986 6.713506 6.655423 6.821029 6.726619 6.615602 6.502844 6.768357 6.593864 6.543667 6.496192
75% 8.067847 7.972242 7.892667 7.716481 7.826232 7.692682 7.529721 7.397640 7.606198 7.504692 7.448275 7.348455
max 9.941246 9.793617 9.386924 9.029415 9.524203 9.044597 9.066551 8.877154 9.467014 9.299971 8.853431 8.514926
In [14]:
resolution.style.background_gradient(cmap ='YlOrRd',axis=None)
Out[14]:
  iTED A B C D
  Crystal 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4
Configuration Window                                        
888 100 6.993667 5.690363 8.003727 6.264532 8.513630 8.685116 7.545204 7.159496 6.921517 6.970458 9.941246 7.024431 5.801541 8.581080 8.260210 6.604624 6.177112 6.154822 6.158417 6.427960
150 6.745153 5.638254 7.943185 6.214287 8.491202 8.421423 7.531137 7.111619 6.842958 6.928608 9.793617 6.849014 5.800469 8.484608 8.059413 6.501383 6.169841 6.125247 6.149794 6.432523
200 6.659179 5.596447 7.917940 6.213641 8.473171 8.180773 7.442451 7.047676 6.765897 6.889133 9.386924 6.661115 5.802972 8.298828 7.884243 6.448186 6.162062 6.119100 6.145520 6.395222
250 6.591387 5.575697 7.894197 6.200813 8.431370 8.083150 7.397516 6.999044 6.719459 6.856619 9.029415 6.493300 5.801645 8.054665 7.657242 6.372846 6.151302 6.100846 6.131791 6.405715
887 100 6.716906 5.885172 7.846681 6.556772 8.926923 8.910126 7.538841 6.771155 7.097204 6.870904 9.524203 6.960888 5.567239 8.476957 7.819416 6.328728 6.363272 5.773790 6.140214 5.898985
150 6.535668 5.800937 7.777560 6.451929 8.902208 8.430194 7.412162 6.688939 7.037385 6.849367 9.044597 6.764300 5.565940 8.303461 7.664389 6.292431 6.348265 5.763566 6.106475 5.867876
200 6.442909 5.771719 7.716941 6.419184 8.891864 8.231809 7.349736 6.622017 6.947128 6.741413 9.066551 6.609188 5.565758 8.082529 7.467314 6.171867 6.333189 5.742967 6.085562 5.842901
250 6.400100 5.753039 7.708582 6.419219 8.877154 8.104824 7.293993 6.586469 6.829195 6.727379 8.635466 6.402065 5.565070 7.867197 7.206193 6.120226 6.323636 5.721918 6.094094 5.811644
88c 100 6.848400 6.095302 7.536584 6.269364 8.602156 8.331459 7.549031 6.688313 6.852857 6.632140 9.467014 7.046612 5.678580 8.494920 7.777696 6.421585 6.130319 5.779793 6.227103 6.130370
150 6.623912 6.037643 7.482337 6.213026 8.631772 8.207789 7.438936 6.593293 6.594435 6.587102 9.299971 6.840054 5.677089 8.397128 7.571756 6.326870 6.111083 5.770381 6.218071 6.112710
200 6.583704 6.009039 7.407379 6.181999 8.537732 7.989468 7.375075 6.536205 6.551128 6.534113 8.853431 6.661599 5.677704 8.144216 7.570963 6.219945 6.100512 5.753311 6.207167 6.077498
250 6.509696 5.991072 7.388117 6.165802 8.514926 7.841426 7.285276 6.488878 6.432151 6.536032 8.405071 6.503505 5.676694 7.996617 7.335234 6.191500 6.093731 5.737227 6.195646 6.077063

Energy of the Cesium peak using the current calibration (March 2023, 888, 100ns)¶

In [15]:
fit = spectra.applymap(lambda x: abs(get_resolution(x)[2]-662)/662*100)
In [16]:
fit.T.describe().drop(['count', 'std'], axis=0).style.background_gradient(cmap ='YlOrRd',axis=None)
Out[16]:
Configuration 888 887 88c
Window 100 150 200 250 100 150 200 250 100 150 200 250
mean 2.783928 2.920516 3.030763 3.097189 1.955409 1.920312 1.916828 1.933787 2.357105 2.474974 2.551107 2.606813
min 0.261671 0.273354 0.137220 0.089146 0.029099 0.028333 0.134172 0.095745 0.070286 0.053619 0.043825 0.033794
25% 1.449584 1.852350 1.881064 1.917321 0.325375 0.655081 0.656098 0.700591 1.354216 1.346443 1.336762 1.389725
50% 2.920744 3.069998 3.110387 3.165389 1.821452 1.769053 1.586570 1.651227 2.083279 2.147551 2.184258 2.200536
75% 4.003028 4.287113 4.503136 4.566823 2.765623 2.633653 2.546075 2.561870 3.410597 3.651191 3.736920 3.937449
max 5.426153 5.436203 5.455493 5.461596 6.084582 6.018045 5.972706 5.965306 5.574989 5.593240 5.603651 5.625288

Noise using integral <250keV (Calibration: March 2023, 888, 100ns)¶

In [17]:
noise = spectra.applymap(lambda x: x.Noise(300))
In [18]:
noise.T.describe().drop(['count', 'std'], axis=0).style.background_gradient(cmap ='YlOrRd',axis=None)
Out[18]:
Configuration 888 887 88c
Window 100 150 200 250 100 150 200 250 100 150 200 250
mean 147.405333 136.332833 128.844333 124.132667 142.744833 130.678833 122.841833 118.004833 139.740500 128.302000 120.719500 115.863333
min 52.613333 51.750000 51.196667 50.896667 52.013333 51.530000 51.100000 50.686667 52.420000 51.913333 51.426667 51.176667
25% 110.761667 107.768333 105.264167 103.232500 98.026667 91.974167 90.113333 88.209167 97.673333 92.397500 89.105000 87.293333
50% 131.191667 123.935000 117.980000 114.606667 122.870000 118.603333 115.718333 111.946667 118.551667 114.095000 111.803333 107.418333
75% 178.795833 168.554167 154.574167 141.446667 175.365833 151.696667 145.940000 141.066667 170.030833 151.110833 143.170833 138.040000
max 295.216667 259.980000 234.353333 215.840000 305.080000 267.790000 241.153333 223.040000 296.756667 259.183333 233.160000 216.130000
In [19]:
noise.style.background_gradient(cmap ='YlOrRd',axis=None)
Out[19]:
  iTED A B C D
  Crystal 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4
Configuration Window                                        
888 100 119.183333 130.153333 193.790000 81.096667 52.613333 183.633333 114.953333 150.380000 132.046667 130.336667 252.506667 295.216667 110.406667 208.473333 165.350000 148.220000 177.183333 101.016667 110.880000 90.666667
150 112.280000 123.680000 185.380000 80.136667 51.750000 166.586667 104.853333 142.573333 122.000000 124.190000 214.490000 259.980000 110.383333 176.540000 134.956667 144.566667 174.456667 100.640000 108.740000 88.473333
200 106.910000 120.353333 181.266667 79.533333 51.196667 154.656667 98.770000 137.286667 114.793333 119.896667 187.350000 234.353333 110.350000 154.546667 116.063333 141.363333 172.856667 100.326667 107.583333 87.430000
250 104.893333 118.760000 179.606667 79.036667 50.896667 147.906667 94.893333 133.993333 111.256667 117.956667 169.926667 215.840000 110.343333 138.113333 104.293333 139.293333 172.010000 100.050000 106.750000 86.833333
887 100 131.343333 122.546667 149.586667 85.713333 52.013333 150.950000 89.736667 187.833333 98.993333 107.770000 275.983333 305.080000 113.680000 219.033333 171.210000 123.193333 189.750000 95.126667 99.643333 85.710000
150 127.100000 116.786667 143.156667 85.006667 51.530000 131.516667 75.943333 177.316667 83.190000 97.453333 233.603333 267.790000 113.690000 186.893333 141.620000 120.420000 185.926667 94.296667 97.183333 83.153333
200 122.646667 113.746667 139.873333 84.353333 51.100000 119.533333 69.373333 170.060000 74.733333 92.033333 205.216667 241.153333 113.656667 164.140000 122.870000 117.690000 183.463333 93.976667 95.670000 81.546667
250 120.596667 112.210000 138.350000 84.046667 50.686667 111.683333 64.916667 165.960000 71.266667 89.596667 186.773333 223.040000 113.676667 149.216667 110.460000 116.156667 182.080000 93.543333 95.006667 80.830000
88c 100 124.536667 112.566667 148.650000 80.943333 52.420000 153.496667 97.643333 187.423333 96.133333 102.266667 260.886667 296.756667 108.990000 209.876667 164.233333 125.050000 189.416667 97.683333 98.906667 86.930000
150 119.236667 108.296667 142.756667 79.963333 51.913333 135.673333 84.203333 176.173333 84.213333 94.896667 220.000000 259.183333 108.953333 177.436667 136.253333 122.663333 185.660000 97.060000 96.603333 84.900000
200 114.663333 105.933333 138.870000 79.273333 51.426667 122.496667 76.666667 168.580000 77.730000 90.963333 192.916667 233.160000 108.943333 156.073333 117.466667 119.730000 183.883333 96.663333 95.420000 83.530000
250 111.853333 104.570000 137.356667 78.936667 51.176667 114.453333 72.666667 163.726667 74.293333 88.736667 173.936667 216.130000 108.936667 140.090000 105.900000 118.106667 182.383333 96.403333 94.646667 82.963333

Alpha activity rate using 1600keV < E < 2800keV (Calibration: March 2023, 888, 100ns)¶

In [20]:
alpha = spectra.applymap(lambda x: x.Alpha(300))
In [21]:
alpha.T.describe().drop(['count', 'std'], axis=0).style.background_gradient(cmap ='YlOrRd',axis=None)
Out[21]:
Configuration 888 887 88c
Window 100 150 200 250 100 150 200 250 100 150 200 250
mean 151.097667 150.797667 150.653667 150.514000 154.837500 154.582500 154.394500 154.275000 152.493167 152.222833 151.983333 151.891667
min 23.603333 23.700000 23.723333 23.760000 23.936667 23.973333 24.003333 24.016667 24.230000 24.270000 24.380000 24.436667
25% 95.206667 95.145833 95.174167 95.186667 102.195000 102.238333 102.378333 102.337500 94.688333 94.653333 94.688333 94.721667
50% 176.700000 176.380000 176.303333 175.900000 181.468333 181.301667 181.325000 181.373333 175.650000 175.340000 175.136667 175.093333
75% 216.720833 216.290833 216.127500 216.008333 221.419167 220.749167 220.326667 220.070000 221.795000 221.416667 220.708333 220.585000
max 238.063333 238.066667 238.070000 238.070000 238.666667 238.663333 238.666667 238.666667 240.580000 240.583333 240.583333 240.583333
In [22]:
alpha.style.background_gradient(cmap ='YlOrRd',axis=None)
Out[22]:
  iTED A B C D
  Crystal 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4
Configuration Window                                        
888 100 24.860000 148.353333 114.170000 36.073333 31.263333 144.330000 121.743333 209.013333 203.166667 216.080000 150.233333 230.230000 238.063333 218.643333 228.553333 23.603333 222.950000 38.316667 206.363333 215.943333
150 24.983333 148.320000 114.080000 36.083333 31.283333 143.596667 120.430000 208.673333 202.793333 215.690000 149.966667 229.516667 238.066667 217.843333 227.483333 23.700000 222.893333 38.343333 206.433333 215.773333
200 25.220000 148.370000 114.116667 36.090000 31.333333 143.350000 119.413333 208.500000 202.830000 215.753333 149.776667 229.026667 238.070000 216.970000 227.050000 23.723333 222.910000 38.346667 206.376667 215.846667
250 25.290000 148.366667 114.143333 36.110000 31.343333 143.176667 118.800000 208.363333 202.626667 215.776667 149.173333 228.880000 238.070000 216.573333 226.470000 23.760000 222.850000 38.316667 206.370000 215.820000
887 100 24.356667 153.090000 122.986667 36.220000 30.953333 152.093333 134.123333 212.510000 209.846667 222.486667 152.493333 232.793333 238.666667 221.063333 231.833333 23.936667 225.200000 39.820000 213.570000 218.706667
150 24.453333 153.113333 123.040000 36.230000 31.023333 152.030000 131.930000 212.270000 209.490000 222.096667 152.710000 232.123333 238.663333 220.300000 231.030000 23.973333 225.110000 39.833333 213.546667 218.683333
200 24.610000 153.103333 123.233333 36.260000 31.046667 151.953333 130.370000 212.096667 209.546667 222.146667 152.266667 231.810000 238.666667 219.720000 230.076667 24.003333 224.970000 39.813333 213.556667 218.640000
250 24.713333 153.210000 123.183333 36.233333 31.053333 151.973333 129.570000 211.876667 209.536667 222.030000 151.726667 231.156667 238.666667 219.416667 230.063333 24.016667 224.990000 39.800000 213.550000 218.733333
88c 100 24.230000 144.443333 113.343333 34.836667 31.183333 147.626667 123.030000 206.073333 200.206667 218.760000 151.093333 232.263333 240.580000 220.146667 228.853333 24.933333 227.563333 38.723333 215.233333 226.740000
150 24.270000 144.353333 113.293333 34.786667 31.203333 147.060000 121.280000 205.773333 199.803333 218.590000 150.876667 231.760000 240.583333 219.680000 227.953333 25.010000 227.630000 38.733333 215.190000 226.626667
200 24.380000 144.273333 113.340000 34.780000 31.230000 146.900000 119.803333 205.500000 199.890000 218.460000 150.383333 231.193333 240.583333 218.746667 227.136667 25.050000 227.530000 38.733333 215.160000 226.593333
250 24.436667 144.393333 113.380000 34.766667 31.270000 146.443333 118.963333 205.386667 199.816667 218.576667 150.370000 230.890000 240.583333 218.523333 226.910000 25.093333 227.546667 38.746667 215.126667 226.610000

Correlations¶

In [23]:
df = pandas.concat([resolution,alpha,noise,fit],keys=["Resolution","Alpha","Noise","Fit"]).drop(['888','887'], level=1, axis=0).drop([100,150,200], level=2, axis=0).T
In [24]:
df.corr().style.background_gradient(cmap ='YlOrRd',axis=None)
Out[24]:
      Resolution Alpha Noise Fit
    Configuration 88c 88c 88c 88c
    Window 250 250 250 250
  Configuration Window        
Resolution 88c 250 1.000000 -0.103391 0.035082 0.251798
Alpha 88c 250 -0.103391 1.000000 0.361384 -0.096734
Noise 88c 250 0.035082 0.361384 1.000000 0.047501
Fit 88c 250 0.251798 -0.096734 0.047501 1.000000

Draw fits¶

In [25]:
canvas = spectra.applymap(TH1D_draw)
#canvas.applymap(lambda x: type(x).__name__)
In [26]:
for col in canvas.columns:
    for row in canvas.index:
        canvas.loc[row,col].Draw()

Conclusions:¶

  • File sizes:
    • Decreasing the threshold from 888 to 887 results in a .singles.ldat file with x3 the size.
    • Increasing the threshold manually (88c) using 887 as a base results in a .singles.ldat file with 40% of the size.
    • The sizes of 88c and 888 are comparable.
  • Energy resolution:
    • Taking the mean value for the 4 iTEDs with the different integration windows, the energy resolution improves only about .1% when going from 888 to 887.
    • Taking the mean value for the 4 iTEDs with the different integration windows, the energy resolution improves only about .15% when going from 888 to 88c.
    • The energy resolution is above 8% for 3 (iTED-A-4, iTED-B-0 and iTED-C-0) for 887 and 2 (iTED-A-4 and iTED-C-0) for 88c using the 250ns.
  • Correlations:
    • There doesn't seem to exist any sort of correlation between energy resolution and noise or alpha rate.